package com.pokermind.model.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

/**
 * AI分析请求DTO - V4.10最终版
 *
 * V4.10变更：
 * - 增加可选字段（to_call, pot, hero_stack等），优先使用客户端提供的实时数据
 * - 如果客户端未提供这些字段，服务端从数据库计算
 * 
 * V4.9变更：
 * - hole_cards 改为必需字段（不再支持无底牌分析）
 * - 简化请求，只需4个必需字段
 * 
 * V4.1变更：
 * - 增加table_id字段（所有接口统一）
 * - 使用hand_id替代hand_record_id（客户端友好）
 *
 * @author PokerMind Team
 */
@JsonIgnoreProperties(ignoreUnknown = true)  // 忽略未知字段（如旧版本的hand_record_id）
public class AIAnalysisRequest {

    // ========== 必需字段 ==========
    
    /**
     * 桌子ID - 必需字段
     * 业务含义：table_id + hand_id 唯一标识一个手牌
     */
    @JsonProperty("table_id")
    private String tableId;

    /**
     * 手牌ID - 必需字段
     * 业务含义：客户端生成的手牌唯一标识
     * 通过这个ID可以获取到： 
     * - 当前街道、牌面信息、底池状况
     * - 所有玩家信息、完整的行动历史
     */
    @JsonProperty("hand_id")
    private String handId;

    /**
     * 玩家ID - 必需字段
     * 指定要分析决策的玩家
     */
    @JsonProperty("player_id")
    private String playerId;
    
    /**
     * 底牌 - 必需字段（V4.9+）
     * V4.9: 必须提供底牌，不再支持无底牌分析
     * 格式：[50, 47] (数字数组，代表卡牌编码)
     */
    @JsonProperty("hero_cards")
    private List<Integer> heroCards;
    
    // ========== 可选字段（V4.10新增）==========
    // 如果客户端提供了这些实时数据，服务端优先使用，避免从数据库重新计算
    
    /**
     * 需要跟注的金额 - 可选字段
     * 客户端可以提供实时计算的 to_call 值
     */
    @JsonProperty("to_call")
    private Integer toCall;
    
    /**
     * 当前底池 - 可选字段
     */
    @JsonProperty("pot")
    private Integer pot;
    
    /**
     * Hero当前筹码 - 可选字段
     */
    @JsonProperty("hero_stack")
    private Integer heroStack;
    
    /**
     * Hero位置 - 可选字段
     */
    @JsonProperty("hero_position")
    private String heroPosition;
    
    /**
     * 当前街道 - 可选字段
     */
    @JsonProperty("street")
    private String street;
    
    /**
     * 公共牌 - 可选字段
     */
    @JsonProperty("board_cards")
    private List<String> boardCards;
    
    /**
     * 活跃对手数 - 可选字段
     */
    @JsonProperty("active_opponents")
    private Integer activeOpponents;
    
    /**
     * 返回语言 - 可选字段
     * 可选值: "zh-CN"(中文), "en-US"(英文)
     * 默认: "zh-CN"
     */
    @JsonProperty("language")
    private String language;

    // 默认构造函数
    public AIAnalysisRequest() {
    }

    public AIAnalysisRequest(String tableId, String handId, String playerId, List<Integer> heroCards) {
        this.tableId = tableId;
        this.handId = handId;
        this.playerId = playerId;
        this.heroCards = heroCards;
    }

    // Getters and Setters
    public String getTableId() {
        return tableId;
    }

    public void setTableId(String tableId) {
        this.tableId = tableId;
    }

    public String getHandId() {
        return handId;
    }

    public void setHandId(String handId) {
        this.handId = handId;
    }

    public String getPlayerId() {
        return playerId;
    }

    public void setPlayerId(String playerId) {
        this.playerId = playerId;
    }

    public List<Integer> getHeroCards() {
        return heroCards;
    }

    public void setHeroCards(List<Integer> heroCards) {
        this.heroCards = heroCards;
    }

    public Integer getToCall() {
        return toCall;
    }

    public void setToCall(Integer toCall) {
        this.toCall = toCall;
    }

    public Integer getPot() {
        return pot;
    }

    public void setPot(Integer pot) {
        this.pot = pot;
    }

    public Integer getHeroStack() {
        return heroStack;
    }

    public void setHeroStack(Integer heroStack) {
        this.heroStack = heroStack;
    }

    public String getHeroPosition() {
        return heroPosition;
    }

    public void setHeroPosition(String heroPosition) {
        this.heroPosition = heroPosition;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public List<String> getBoardCards() {
        return boardCards;
    }

    public void setBoardCards(List<String> boardCards) {
        this.boardCards = boardCards;
    }

    public Integer getActiveOpponents() {
        return activeOpponents;
    }

    public void setActiveOpponents(Integer activeOpponents) {
        this.activeOpponents = activeOpponents;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    @Override
    public String toString() {
        return "AIAnalysisRequest{" + 
               "tableId='" + tableId + '\'' +
               ", handId='" + handId + '\'' + 
               ", playerId='" + playerId + '\'' + 
               ", heroCards=" + heroCards + 
               ", toCall=" + toCall +
               ", pot=" + pot +
               ", heroStack=" + heroStack +
               ", heroPosition='" + heroPosition + '\'' +
               ", street='" + street + '\'' +
               ", boardCards=" + boardCards +
               ", activeOpponents=" + activeOpponents +
               '}';
    }
}